package xfuzzy.alg_genetico.indeterminado.xfghlOld.model.hierStruct;



/**
 * Clase que representa un modulo difuso de 2 entradas 1 salida, implementa la interfaz XfghlINode
 * @author Sergio Cala Cordero, Septiembre 2009, Herramienta Xfghl
 *
 */
public class XfghlModule implements XfghlINode {

	/**
	 * Identificador del modulo
	*/
	private int idMod;
	
	/**
	 * Entrada1
	*/
	private XfghlINode ent1;
	
	/**
	 * Entrada2
	 */
	private XfghlINode ent2;
	
	/**
	 * Salida
	 */
	private XfghlINode sal;
	
	/**
	 * Constructor por defecto
	 */
	public XfghlModule()
	{
		this.idMod=-1;
		this.ent1=null;
		this.ent2=null;
		this.sal=null;
	}	
	
	/**
	 * 
	 * @param sal
	 */
	public XfghlModule(XfghlModule sal)
	{   this.idMod=-1;		
		this.ent1=null;
		this.ent2=null;
		this.sal=sal;
	}	
	
	/**
	 * 
	 * @param ent1
	 * @param ent2
	 * @param sal
	 * @param idMod
	 */
	public XfghlModule(XfghlINode ent1,XfghlINode ent2,XfghlINode sal,int idMod)
	{
		this.idMod=idMod;
		this.ent1=ent1;
		this.ent2=ent2;
		this.sal=sal;
	}
	
	/**
	 * GETTER AND SETTER
	 * 
	 */
	
	public int getIdMod()
	{
		return this.idMod;		
	}	

	public XfghlINode getEnt1()
	{
		return ent1;
	}
	
	public XfghlINode getEnt2()
	{
		return ent2;
	}
	
	public XfghlINode getSal()
	{
		return sal;
	}
	
	public void setIdMod(int idMod)
	{
		this.idMod=idMod;		
	}

	public void setEnt1(XfghlINode ent1)
	{
		this.ent1=ent1;
	}
	
	public void setEnt2(XfghlINode ent2)
	{
		this.ent2=ent2;
	}
	
	public void setSal(XfghlINode sal)
	{
		this.sal=sal;
	}
	
	/**
	 * Nos dice si el m�dulo es vacio
	 * @return true o false
	 */
	public boolean esVacio()
	{
		return this.sal==null;
	}
	
	
	/**
	 * Imprime por pantalla el XfghlModule
	 */
	public void imprime()
	{
		System.out.println();
		
		//Identificador
	//	System.out.println("Id M�dulo: "+this.idMod);		

		//Salida
		System.out.print("M"+this.idMod+" Salida: ");
		sal.imprime();
		
		//Entrada 1
		System.out.print("M"+this.idMod+" Entrada 1: ");	
		ent1.imprime();
		
		//Entrada 2
		System.out.print("M"+this.idMod+" Entrada 2: ");	
		ent2.imprime();	
	}

	/**
	 * copia un INodo
	 * @return Devuelve un XfghlINode
	 */
	public XfghlINode insert() {

		return this;
	}
	
	/**
	 * M�todo que nos permite copiar un XfghlNode o a�adir un XfghlNode a un XfghlModule.
	 * @param par valor nos dice si estamos buscando un M�dulo (0) o un Nodo (1)
	 * MODULO (par=0): Copia un MODULO a�adiendole un nuevo m�dulo que es ent1 del modulo indicado,
	 * 	sus variables son  sal= var+1, ent2=var+2 y su id es idNuevoMod
	 * NODO (par=1): Copia un NODO que va a convertirlo en m�dulo, d�nde sal es el valor del Nodo, el idModulo
	 * es idNuevoMod, ent1 es var+1,ent2 es var+2.
	 * @param numMod N�mero de m�dulos del XfghlModule
	 * @param idNuevoMod Identificador del nuevo m�dulo
	 */	
	public XfghlINode insert(XfghlCounter count,int idNuevoMod) {
		
	   XfghlModule newModule;
	    
	    //Tenemos que ver si alguna entrada coincide con numMod	    	    	    
	    //El modulo que buscamos es la entrada 1
	    if(count.getCounter()==0)
	    {
	    	//Decrementamos
	    	count.decrease();
	    	//Nos creamos la nueva variable interna
			XfghlNode nodeInner=new XfghlNode(idNuevoMod-1,XfghlNode.INNER);
			//Nos creamos el nuevo nodo de entrada
			XfghlNode nodeInput=new XfghlNode(idNuevoMod+1,XfghlNode.INPUT);
			
			XfghlNode nodeOut;
			//Comprobamos si tenemos que intercambiar la variable de salida por
			//de la variable
			if(((XfghlNode)this.getSal()).getType()==XfghlNode.OUTPUT)
			{
				nodeOut=(XfghlNode)this.sal;
				this.sal=nodeInner;				
			}
			else
			{
				nodeOut=nodeInner;
			}
			//Creamos el nuevo m�dulo
			newModule=new XfghlModule(this,nodeInput,nodeOut,idNuevoMod);		    
		    
	    }
	    //Si a�n no hemos insertado el nuevo m�dulo
	    else if(count.getCounter()>0)
	    {
	    	//Decrementamos
	    	count.decrease();	    	
	    	//Actualizamos los hijos del m�dulo
	    	this.ent1=ent1.insert(count, idNuevoMod);
	    	this.ent2=ent2.insert(count, idNuevoMod);
	    	newModule=this;
	    }
	    //Si ya lo hemos encontrado this no se modifica
	    else
	    {
	    	newModule=this;
	    }
		return newModule;
	}
}
